Системное программирование

Системное программирование в Linux

Системное программирование

Введение

Системное программирование — это разработка программного обеспечения, которое взаимодействует напрямую с операционной системой и аппаратным обеспечением. В Linux системное программирование охватывает широкий спектр задач: от работы с файлами и процессами до управления памятью и сетевыми интерфейсами.

Системное программирование в Linux
Системное программирование

1. Языки программирования

  • C: Основной язык для системного программирования в Linux. Большинство системных вызовов и библиотек написаны на C.
  • C++: Также используется, особенно в современных проектах, где требуется объектно-ориентированный подход.
  • Ассемблер: Для крайне низкоуровневых задач.
  • Rust: Набирает популярность благодаря безопасности и производительности.
Системное программирование в Linux
Системное программирование

2. Системные вызовы (System Calls)

Системные вызовы — это интерфейс между пользовательскими программами и ядром Linux. Примеры:

  • fork(): Создание нового процесса.
  • exec(): Замена образа процесса.
  • open(), read(), write(), close(): Работа с файлами.
  • socket(), bind(), listen(), accept(): Сетевые взаимодействия.
  • mmap(): Работа с памятью.
  • wait(): Ожидание завершения дочернего процесса.
Системное программирование в Linux
Системное программирование

Пример использования fork():

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        printf("Child process\n");
    } else {
        printf("Parent process\n");
    }
    return 0;
}
Системное программирование в Linux
Системное программирование

3. Библиотеки

  • Glibc: Стандартная библиотека C, предоставляющая обёртки для системных вызовов.
  • POSIX: Стандарт, определяющий API для совместимости между UNIX-подобными системами.
  • Boost: Для C++ разработки, предоставляет высокоуровневые абстракции.
Системное программирование в Linux
Системное программирование

4. Работа с процессами

  • Создание процессов: fork(), exec().
  • Управление процессами: wait(), kill(), signal().
  • Межпроцессное взаимодействие (IPC):
    • Каналы (pipes): pipe().
    • Очереди сообщений: msgget(), msgsnd(), msgrcv().
    • Разделяемая память: shmget(), shmat().
    • Семафоры: semget(), semop().
Системное программирование в Linux
Системное программирование

5. Работа с файловой системой

  • Открытие, чтение и запись файлов: open(), read(), write().
  • Управление файловыми дескрипторами: dup(), fcntl().
  • Работа с каталогами: opendir(), readdir().
  • Изменение прав доступа: chmod(), chown().
Системное программирование в Linux
Системное программирование

6. Управление памятью

  • Выделение памяти: malloc(), free().
  • Работа с виртуальной памятью: mmap(), munmap().
  • Управление стеком и кучей.
Системное программирование в Linux
Системное программирование

7. Сетевое программирование

  • Создание сокетов: socket().
  • Установка соединений: bind(), listen(), accept(), connect().
  • Передача данных: send(), recv().
  • Работа с протоколами: TCP, UDP, HTTP и др.
Системное программирование в Linux
Системное программирование

Пример TCP-сервера:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    int server_socket, client_socket;
    struct sockaddr_in server_addr, client_addr;
    socklen_t addr_len = sizeof(client_addr);
    char buffer[1024];

    server_socket = socket(AF_INET, SOCK_STREAM, 0);
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    server_addr.sin_addr.s_addr = INADDR_ANY;

    bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));
    listen(server_socket, 5);

    client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &addr_len);
    read(client_socket, buffer, sizeof(buffer));
    printf("Received: %s\n", buffer);
    close(client_socket);
    close(server_socket);
    return 0;
}
Системное программирование в Linux
Системное программирование

8. Многопоточность

  • Создание потоков: pthread_create().

  • Синхронизация: мьютексы (pthread_mutex_t), условные переменные (pthread_cond_t).

  • Пример:

    #include <pthread.h>
    #include <stdio.h>
    
    void* thread_func(void* arg) {
        printf("Hello from thread!\n");
        return NULL;
    }
    
    int main() {
        pthread_t thread;
        pthread_create(&thread, NULL, thread_func, NULL);
        pthread_join(thread, NULL);
        return 0;
    }
    
Системное программирование в Linux
Системное программирование

9. Отладка и профилирование

  • GDB: Отладчик для C/C++.
  • Valgrind: Инструмент для поиска утечек памяти.
  • strace: Трассировка системных вызовов.
  • perf: Профилирование производительности.
Системное программирование в Linux
Системное программирование

10. Инструменты разработки

  • Компиляторы: GCC, Clang.
  • Сборка проектов: Make, CMake.
  • Системы контроля версий: Git.
Системное программирование в Linux